﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace App_Persistencia
{
    public class Menu_Data
    {

        List<Menu_Detalle_Data> menu_Detalles;

        public List<Menu_Detalle_Data> Menu_Detalles
        {
            get { return menu_Detalles; }
            set { menu_Detalles = value; }
        }
        
        int id;
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        string nombre;
        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        string descripcion;
        public string Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }
        float precio;
        public float Precio
        {
            get { return precio; }
            set { precio = value; }
        }
        int menu_Tipo;
        public int Menu_Tipo
        {
            get { return menu_Tipo; }
            set { menu_Tipo = value; }
        }
        public DataTable cargarMenu()
        {
            //Creo la sentencia SQL
            string commandSQL = " SELECT     Menu.menu_Id, Menu.menu_Nombre, Menu_Tipo.tMenu_Nombre AS TipoNombre, Menu_Tipo.tMenu_Id AS TipoId "
                                +" FROM Menu INNER JOIN "
                                +" Menu_Tipo ON Menu.tipoMenu_Id = Menu_Tipo.tMenu_Id ";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            //creo la vista de la consulta
            //DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            //dataView = dataSet.Tables["Menu"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];
            return dataTable;
            // --- Vercion Profesor con edicion de GridView
        }

        //BORRAR DESPUES DE 2da o 3er Iteracion.
        public DataTable menuCompletoConId()
        {
            //Creo la sentencia SQL
            string commandSQL = " SELECT     Menu.menu_Id, Menu.menu_Nombre, Menu_Tipo.tMenu_Nombre AS TipoNombre, Menu_Tipo.tMenu_Id AS TipoId "
                                + " FROM Menu INNER JOIN "
                                + " Menu_Tipo ON Menu.tipoMenu_Id = Menu_Tipo.tMenu_Id "
                                + " Where Menu.menu_Id = "+Id;

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            //creo la vista de la consulta
            //DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            //dataView = dataSet.Tables["Menu"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];
            return dataTable;
            // --- Vercion Profesor con edicion de GridView
        }

        public DataView cargarMenuEspecial()
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT menu_Id, menu_Nombre FROM Menu WHERE tipoMenu_Id = 2 ";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["Menu"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];

            return dataView;

            // --- Vercion Profesor con edicion de GridView

        }
        
       

        public void buscarUnMenu()
        {
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            //SqlTransaction transaccion = connection.BeginTransaction(); ;

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                //command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spBuscarUnMenu";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                // Establesco el parametro @SocId, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@MenId", id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                //// Establesco el parametro @SocDenom                
                //param = command.Parameters.AddWithValue("@BebNombre", nombre);
                //param.DbType = DbType.String;
                //param.Size = 50;
                //param.Direction = ParameterDirection.Output;

                //// Establesco el parametro @SocDNI
                param = command.Parameters.AddWithValue("@MenPrecio", precio);
                param.DbType = DbType.Double;
                param.Direction = ParameterDirection.Output;

                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                //recupero el valor del parametro @UsuarioId
                //usuarioId = Convert.ToInt32(command.Parameters["@UsuarioId"].Value);
                precio = float.Parse(command.Parameters["@MenPrecio"].Value.ToString());

                //socNombre = command.Parameters["@SocDenom"].Value.ToString();
                //socDNI = Convert.ToInt32(command.Parameters["@SocDNI"].Value);
                //socTelefono = command.Parameters["@SocTelefono"].Value.ToString();
                //socDireccion = command.Parameters["@SocDir"].Value.ToString();
                //socDirNum = command.Parameters["@SocDirNum"].Value.ToString();
                //socDirDepto = command.Parameters["@SocDirDepto"].Value.ToString();
                //socTelEmerg = command.Parameters["@SocTelEmergencia"].Value.ToString();
                //socContacto = command.Parameters["@SocContacto"].Value.ToString();
                //socFecNac = Convert.ToDateTime(command.Parameters["@SocFecNac"].Value);
                //socEstatura = Convert.ToDouble(command.Parameters["@SocEstatura"].Value);
                //socEmail = command.Parameters["@SocEmail"].Value.ToString();
                //socEstado = Convert.ToInt32(command.Parameters["@SocEstado"].Value);
                //socPlan = Convert.ToInt32(command.Parameters["@SocPlan"].Value);

            }
            catch (Exception e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                //transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);
                throw new ApplicationException();
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }
        }

        public DataTable buscarMenuesPorPresupuesto(int id)
        {
            //Creo la sentencia SQL
            //string commandSQL = "SELECT pre_Id, pre_FechaCreacion, pre_FechaEvento, pre_CantPersonas, tipoEvento_Id, salon_Id, cliente_Id "
            //                   + "FROM Presupuesto ORDER BY pre_FechaCreacion";

            string commandSQL = "SELECT Menu.menu_Id AS MenuId, Menu.menu_Nombre AS Nombre, Menu.menu_Descripcion AS Descripcion, Menu.menu_PrecioVenta AS Precio, Menu.tipoMenu_Id AS TipoMenuId"
                                + " FROM Menu INNER JOIN "
                                + " Presupuesto_Detalle ON Menu.menu_Id = Presupuesto_Detalle.menu_Id INNER JOIN "
                                + " Presupuesto ON Presupuesto_Detalle.presupuesto_Id = Presupuesto.pre_Id ";

            if (id != -1)
            {
                StringBuilder s = new StringBuilder(commandSQL);
                s.Append(" WHERE (presupuesto_Id = " + id.ToString() + ")");
                commandSQL = s.ToString();
            }

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];
            return dataTable;
        }

        public float damePrecio(int idMenu)
        {

            // Abro la conexion

            float precioMenu = 0;
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            try
            {
                connection.Open();
                SqlCommand cmd = new SqlCommand("SELECT Menu.menu_Id, Menu.menu_Nombre, SUM (Alimento_Detalle.dAli_Cantidad * Menu_Detalle.dMenu_Cantidad * Insumo.ins_Precio) AS PrecioXMenu " +

                     "   FROM         Menu_Detalle INNER JOIN " +
                    "  Menu ON Menu_Detalle.menu_Id = Menu.menu_Id INNER JOIN " +
                   "   Alimento ON Menu_Detalle.alimento_Id = Alimento.ali_Id INNER JOIN " +
                   "   Alimento_Detalle ON Alimento.ali_Id = Alimento_Detalle.alimento_Id INNER JOIN " +
                   "   Insumo ON Alimento_Detalle.insumo_Id = Insumo.ins_Id " +
                   "     WHERE     (Alimento_Detalle.dAli_Cantidad IS NOT NULL) AND (Menu_Detalle.dMenu_Cantidad IS NOT NULL) AND menu.menu_id = " + idMenu +
                    "    GROUP BY Menu.menu_Id, Menu.menu_Nombre ", connection);
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    precioMenu = float.Parse(dr["PrecioXMenu"].ToString());

                }

                //return valido;
            }
            catch (Exception e)
            {
                precioMenu = 0;
                String a = e.ToString();
            }

            finally
            {
                // Cierro la conexion
                connection.Close();
            }
            return precioMenu;
        }

        public DataTable buscarMenuesPorEvento(int id)
        {
                        string commandSQL = "SELECT        Menu.menu_Id AS MenuId, Menu.menu_Nombre AS Nombre, Menu.menu_Descripcion AS Descripcion, Menu.tipoMenu_Id AS TipoMenuId "+
                                            "FROM          Menu INNER JOIN EventoxMenu ON Menu.menu_Id = EventoxMenu.menu_Id INNER JOIN "+
                                                          "Evento ON EventoxMenu.evento_Id = Evento.eve_Id "+
                                            "WHERE        (Evento.eve_Id = "+id.ToString()+")";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, new SqlConnection(conexion));

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];
            return dataTable;
        }


        public void cargarDetalleMenu(SqlTransaction pTransaccion, SqlConnection pConnection)
        {
            for (int i = 0; i < menu_Detalles.Count; i++)
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand commandDetalle = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                commandDetalle.Transaction = pTransaccion;
                //Asingo la conexion al objeto conection
                commandDetalle.Connection = pConnection;
                commandDetalle.CommandText = "spCargarMenuDetalle";
                commandDetalle.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter paramDetalle;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@MenuId", Id);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@Cantidad", menu_Detalles[i].Cantidad);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Establesco el parametro @EjeId, uso como entrada los atributos de la clase
                paramDetalle = commandDetalle.Parameters.AddWithValue("@AlimentoId", menu_Detalles[i].Alimento);
                paramDetalle.DbType = DbType.Int32;
                paramDetalle.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                commandDetalle.ExecuteNonQuery();

            }
        }


        public void guardarMenu()
        {
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);
            // Abro la conexion
            connection.Open();
            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarMenu";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                // Establesco el parametro @SocDenom, uso como entrada los atributos de la clase
                param = command.Parameters.AddWithValue("@Nombre", Nombre);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Descripcion", Descripcion);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@fechaCreacion", System.DateTime.Now);
                param.DbType = DbType.DateTime;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@TipoMenuId", Menu_Tipo);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // Establesco el parametro @SocDirDepto
                param = command.Parameters.AddWithValue("@MenuId", Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Output;


                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                id = Convert.ToInt32(command.Parameters["@MenuId"].Value);

                cargarDetalleMenu(transaccion, connection);

                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        /// <summary>
        /// modificado por mauricio agregando 2 atributos al principio de la consulta 
        /// </summary>
        /// <param name="idMenu">identificador que representa al menu</param>
        /// <returns>Tabla de Detalles de Menu Relacionados</returns>
        public DataTable cargarMenuDetalles(int idMenu)
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT    Alimento.ali_Id AS IdAlimento, Alimento_Tipo.tAli_Id AS Tipo_De_Alimento_Id, Alimento_Tipo.tAli_Nombre As Tipo_De_Alimento, Alimento.ali_Nombre As Nombre, Alimento.ali_Descripcion As Descripcion, Menu.menu_Id as MenuId " +
                                "FROM      Menu, Menu_Detalle,  Alimento, Alimento_Tipo " +
                                "WHERE     Menu.menu_Id = Menu_Detalle.menu_Id AND Menu_Detalle.alimento_Id = Alimento.ali_Id AND Alimento.tipoAlimento_Id = Alimento_Tipo.tAli_Id AND Menu.menu_Id = " + idMenu +
                                "ORDER BY Alimento_Tipo.tAli_Id";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Menu");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["Menu"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["Menu"];

            //return dataView;
            return dataTable;

            // --- Vercion Profesor con edicion de GridView

        }



    }
}
